Proposition d’avant-propos : Le logement entretient un lien organique avec les territoires. Il en est un révélateur. Tout d’abord en tant qu’élément déterminant de la physionomie des espaces et de leur morphologie. Ensuite, parce que précisément ancré dans un territoire,, le logement se situe à la croisée de nombreuses influences : situation de l’emploi, présence de services, aménités naturelles interviennent dans les choix résidentiels des ménages, et contribuent ainsi à apprécier ou déprécier sa valeur.

Cette étude propose une analyse systématique des marchés du logement au prisme de l’analyse territoriale : quelles sont les disparités qui traversent ces marchés ? Quelles en sont les trajectoires ? Quel est le degré de cohésion dans ces espaces ? Autant d’éléments d’analyse qui permettent de replacer le logement au cœur des problématiques territoriales et qui offrent une grille de lecture originale des territoires.

Le maillage sur lequel s’appuie cette étude consitue par ailleurs un nouvel outil d’analyse des territoires, et complète les maillages d’études (par opposition aux zonages réglementaires comme le zonageA,B,C) proposés par l’Insee. Il permet une lecture plus claire des disparités territoriales propres au logement à l’échelle nationale. En revanche, il ne saurait être adapté au portage de politiques publiques du logement.

Introduction : : la majorité des marchés locaux du logement présentent une inadéquation entre offre et demande. D’une part, certains marchés, principalement d’Île de France, présentent une demande excédentaire, qui tire les prix à la hausse ; les situations de suroccupation y sont également plus fréquentes. D’autre part, dans les espaces de faible densité démographique, on trouve de nombreux territoires où les prix sont très modérés et les logements plus souvent vacants et moins peuplés. Entre ces deux extrêmes, les espaces périurbains et les centre-villes des métropoles de province présentent des marchés plus équilibrés et plus homogènes.

Au fil du temps, ces spécificités se renforcent et les marchés déjà en tension voient leurs déséquilibres se renforcer. A l’inverse, le ralentissement démographique et le vieillissement à l’œuvre dans les espaces faiblement peuplés contribuent à la faible dynamique des marchés où la demande est déjà modérée. Par ailleurs, ces marchés présentent un degré inégal d’homogénéité, et on trouve d’avantage de diversité entre les communes de marchés de l’Est de la France.

Les marchés du logement sont avant tout caractérisés par le pouvoir d’achat immobilier des ménages

Introduction : Neuf indicateurs ont été mobilisés pour décrire les marchés locaux du logement. Parmi eux, le pouvoir d’achat immobilier et le nombre de personnes par ménage sont ceux qui permettent de comprendre au mieux les disparités territoriales en termes de logement

Pour rendre compte de l’état des marchés locaux du logement, 9 indicateurs ont été sélectionnés à l’échelle de la maille habitat (voir encadrés). Parmi eux, le prix du m^2 dans l’ancien rapporté au revenu médian communal, qui mesure pour les ménages d’une commune donnée, le nombre d’années de revenu nécessaires pour acquérir 100 \(m^2\) dans cette même commune, est celui pour lequel l’hétérogénéité est la plus forte (figure 1). Il permet d’approcher les marchés du logement (à travers le prix au \(m^2\)), mais également des caractéristiques sociodémographiques des ménages qui composent la commune, à travers leur revenu médian.

La représentation cartographique de cet indicateur met tout d’abord en évidence les centres urbains, ainsi que les espaces littoraux, de montagne, ou encore frontaliers. Il révèle non seulement les marchés du logement où les prix absolus sont très élevés (Île de France, Genevois français, littoraux…), mais également certains espaces où, malgré des prix relativement modérés, les revenus des habitants sont plutôt faibles, leur rendant ainsi l’accès au logement difficile ; c’est le cas par exemple pour Marseille ou Roubaix. Des phénomènes de gentrification sont susceptibles d’être à l’œuvre dans ces espaces.

Figure : pouvoir d’achat immobilier des ménages

Sources : bases notariales et Filocom, calculs SDES

Après le pouvoir d’achat immobilier, les marchés du logement se distinguent très nettement par la taille des ménages (figure 2) qui habitent les logements, en lien avec l’âge des populations de ces marchés et leur position dans le cycle de vie. Cet indicateur démographique est essentiel pour comprendre les besoins en logement auxquels font face les territoires. Ainsi, dans les villes-centre, où la population est plus jeune, on trouve des ménages plus petits. A l’inverse, dans les couronnes périurbaines, on trouve des ménages de taille importante : ce sont les espaces où les familles avec enfants sont les plus nombreux. Enfin, dans les espaces de faible densité, les ménages sont plus petits, en lien avec le vieillissement qui y est également observé.

Figure : nombre de personnes par ménage

Sources : RP2014, calculs SDES

Encadré : neuf indicateurs pour décrire les marchés du logement

Pour construire et analyser les mailles logement, le SDES a établi une liste de neuf indicateurs à la maille communale. Ces derniers permettent de prendre en compte les spécificités des territoires en matière de logement, et sont peu corrélés les uns aux autres. La description de ces indicateurs figure dans le rapport méthodologique REFERENCE A AJOUTER

  • L’indicateur de jeunesse du parc : part des logement récents (construits après 1975) rapportés à la part des logements anciens (construits avant 1949).
  • Durée d’occupation médiane des logements
  • Taux de transactions dans le marché de l’ancien (nombre de transactions rapporté au nombre de logements)
  • Part de logements sociaux
  • Part de logements en situation de suroccupation
  • Prix au \(m^2\) dans l’ancien rapportés au revenu médian communal
  • Nombre de personnes par ménage
  • Part des résidences secondaires
  • Part de logements vacants

Fin encadré

La part de résidences secondaires fait également apparaître d’importantes disparités territoriales : les espaces urbains sont en effet très peu pourvus en résidences secondaires, notamment les couronnes périurbaines. Les parts les plus élevées de résidences secondaires se trouvent dans les espaces de faible densité démographique, parmi lesquels les zones de montagne (Alpes, Pyrénées, Corse). Les espaces urbains des littoraux comptent également une part importante de ce type de logements. Ce sont donc, de manière générale, les espaces à vocation touristiques qui sont mis en exergue par la cartographie de cet indicateur.

Les marchés du logement présentent des disparités prononcées sur les 7 autres indicateurs, mais dans une moindre mesure. Ils permettent toutefois de dégager des types de marchés du logement dont les caractéristiques dépassent ces trois seules dimensions que sont le pouvoir d’achat immobilier, la taille des ménages et le poids des résidences secondaires dans le parc.

Six types de marchés du logement

Introduction : Les marchés du logement peuvent être regroupés en 6 grandes catégories retraçant essentiellement les disparités en termes de tension, de taille des ménages, d’ancienneté et de composition du parc. Ces catégories recouvrent des réalités territoriales bien définies

Ces disparités permettent de regrouper les marchés du logement en 6 grands types aux caractéristiques très distinctes :

  • Classe 1 : Mailles détendues à dominante rurale. Les mailles appartenant à cette catégorie sont marquées par les prix relatifs les plus bas (figure 3); parallèlement, le taux de vacance y est le plus élevé et le parc le plus ancien. Les ménages y sont également plus petits, et la durée d’occupation des logements est plus élevée que la moyenne. Les mailles de cette classe se trouvent essentiellement dans les espaces de faible densité, hors des zones de montagne, principalement le long de la diagonale Nord-Est / Sud-Ouest (figure 4). Leur empreinte sur le territoire est importante en termes de superficie, mais ces mailles regroupent un peu moins de 19 % de la population.

  • Classe 2 : Mailles peu tendues des couronnes périurbaines. Les ménages sont plutôt de grande taille, la vacance y est faible. Ce groupe est le plus proche de la moyenne sur l’ensemble des indicateurs. Les prix y sont modérés relativement aux revenus, et la durée d’occupation plutôt élevée. La sur-occupation des logements et le taux de vacances sont eux en retrait. Ces mailles se situent essentiellement en périphérie des principales aires urbaines et dessinent le réseau inter-urbain ; Près de 29 % de la population y réside.

  • Classe 3 : Mailles assez tendues des pôles urbains de province. Cette classe de mailles présentent un pouvoir d’achat immobilier un peu en retrait par rapport aux deux précédentes, proche de la moyenne nationale. En revanche, les ménages y sont significativement plus petits et la durée d’occupation en retrait. Ces mailles comptent relativement plus de logements sociaux que les deux types précédents. De fait, on les trouve au cœur des aires urbaines de provinces : ce sont donc des espaces urbains, où la population est plus jeune, donc avec une plus faible proportion de familles, ce qui explique la faible taille des ménages et le turnover plus important. Environ un quart de la population est regroupée dans cette classe.

Figure : Ecart à la moyenne selon la classe

Sources : Calculs SDES

  • Classe 4 : Mailles tendues des couronnes des aires urbaines attractives. Ces mailles sont en très petit nombre, mais sont très spécifique : le parc de logement y est très récent par rapport aux autres et le pouvoir d’achat en retrait par rapport aux 3 classes précédentes. Par ailleurs, la taille des ménages est plutôt importante et la sur-occupation nettement en retrait. Elles se situent dans les espaces périurbains proches des aires urbaines dont la population a fortement crû ces dernières années. Par exemple, on y trouve l’entière banlieue de Toulouse, mais également la périphérie ouest de Bordeaux ou encore l’est de Lyon. L’attractivité résidentielle de ces mailles a donc conduit à des flux de construction de logements importants, mais s’est également traduit par un accroissement des prix. Elles regroupent seulement 2% de la population.

  • Classe 5 : Mailles tendues des espaces touristiques. Cette classe présente avant tout un pouvoir d’achat immobilier en retrait : les prix y sont élevés relativement aux revenus des habitants et un taux de sur-occupation plus élevé. La caractéristique principale est avant tout la forte part de résidences secondaires qu’on y trouve. De fait, ces mailles se situent dans les espaces à vocation touristique, littoraux et montagnards. Le marché des résidences secondaire y pousse les prix à la hausse et accroît le décalage avec les revenus des résidents, ce qui leur confère les caractéristiques de marchés tendus. Ces mailles regroupent environ 7% de la population.

  • Classe 6 : Mailles à difficultés prononcées d’accès au logement. Ce dernier groupe contient les marchés les plus tendus : le pouvoir d’achat immobilier y est nettement en retrait, et le taux de sur-occupation des logements est élevé, tout comme le nombre de personnes par ménages. On y trouve également la plus forte proportion de logements sociaux. Ces mailles correspondent aux marchés tendus d’Île de France, ainsi que ceux où le pouvoir d’achat immobilier des ménages est en retrait du fait de faibles revenus (Roubais, Marseille). 18,4% de la population réside dans ces marchés dont l’empreinte géographique est toutefois très restreinte.

Figure : Les 6 types de marchés du logement

Sources : calculs SDES

Encadré : la construction des mailles habitat
Le SDES a lancé en 2017 un projet visant à construire un maillage du territoire à même de rendre compte des disparités territoriales sur les enjeux propres au logement. En effet, ni les échelles administratives, ni les zonages d’études de l’Insee (zones d’emploi, bassins de vie) ne sont adaptées pour l’analyse localisée du logement, car ils mêlent dans les mêmes mailles des types d’habitat différents (urbain et périurbains notamment). Le groupe de travail constitué pour ce projet a sélectionné les neuf indicateurs présentés ci-avant et choisit une méthode de régionalisation afin de regrouper les communes homogènes sur ces neuf dimensions dans des mailles habitat. La méthode retenue est l’algorithme SKATER (Spatial Klustering Analysis by Tree Edge Removal).
Différentes simulations ont été menées pour déterminer la taille de ces mailles, et les résultats ont fait l’objet de tests au niveau régional. Ces mailles mettent au premier plan les disparités propres au logement (pouvoir d’achat immobilier, taille des ménages), alors que la maille communale fait principalement ressortir les disparités liées au degré d’urbanité. Elle permet également de distinguer les villes-centre de leur périphérie, et donc d’isoler les enjeux propres à ces espaces très différents sur le plan du logement. Le guide méthodologique détaillant la démarche et les méthodes utilisées se trouve sur cette page à ajouter

Cohésion et dynamique de ces marchés

Introduction : Bien que la méthode consiste à regrouper les communes proches du point de vue des indicateurs de marché retenus, ces marchés ainsi constitués sont plus ou moins homogènes, en particulier une diversité importante est observée dans les espaces de faible densité. Toutefois, les trajectoires de ces marchés du logement tendent à renforcer leurs spécificités propres, ce qui contribue à valider le maillage.

La typologie précédente permet de mettre en évidence les grandes disparités qui traversent les différents marchés du logement. Mais ces marchés présentent de l’hétérogénéité également entre les communes qui les composent. Le score de diversité (voir encadré) montre des spécificités territoriales marquées. En premier lieu, les communes dans l’urbain et le périurbain sont plus homogènes que les espaces de faible densité démographique. Par ailleurs, les mailles de la classe correspondant aux espaces à vocation touristique présentent une forte hétérogénéité interne (figure 5) c’est le cas par exemple de la Normandie et du plateau de Langres. Une partie de la couronne périurbaine de Paris, à l’exception de l’Ouest présente également des marchés très disparates. A l’opposé, l’Ouest du pays apparaît plus homogène, notamment la Bretagne et les Pays de la Loire. Le département du Nord, ainsi que l’Alsace et le Lyonnais présentent également de moindres disparités internes.

Encadré : le score de diversité Pour mesurer les disparités entre les communes au sein d’un même marché du logement (maille), on calcule un score de diversité : il s’agit de la somme des écarts-types, calculés sur chacun des indicateurs (qui ont été centrés-réduits au préalable). Plus ce score est élevé, plus l’hétérogénéité de la maille considérée est importante. Certaines mailles n’étant constituées que d’une seule commune (généralement les villes-centres des aires urbaines), ce score n’est pas calculable.

** Figure : Score d’hétérogénéité par maille**

Source : calculs SDES

L’analyse statique des indicateurs permet donc de mettre en évidence des disparités inter et intra-mailles. L’analyse de ces indicateurs en évolution montre la dynamique de ces espaces. Or, la corrélation entre les indicateurs pris en stock (c’est à dire à un instant T) et en évolution est systématiquement positive : la diagonale de la figure 6 illustre ces corrélations. Cela signifie donc que la trajectoire des marchés du logement est étroitement liée à leur situation. En d’autres termes, les caractéristiques de ces marchés ont tendance à se renforcer dans le temps. Par exemple, il existe une forte corrélation entre le niveau du pouvoir d’achat immobilier (prix rapportés aux revenus) et son évolution au cours du temps, ce qui signifie que les prix ont le plus progressé dans les mailles où ils sont les plus élevés. Le constat est similaire pour la durée d’occupation des logements qui a progressé là où elle était déjà élevée. Sur les autres indicateurs, la corrélation est plus faible, mais toujours positive.

**Figure : Corrélation entre les indicateurs de stock et d’évolution

Sources : calculs SDES

Ces dynamiques se retrouvent dans les évolutions de population. En effet, d’une manière générale, la population croît plus rapidement dans les marchés tendus (plus précisément dans les classes 4 à 6) ; la dynamique de la demande, et la relative rigidité de l’offre tend donc à renforcer les déséquilibres observés sur les marchés locaux du logement. Les mailles en couronnes des aires urbaines attractives sont celles dont la population a le plus rapidement augmenté, à raison de 1,5 % chaque année entre 1999 et 2014. Viennent ensuite les mailles des espaces touristiques dont la croissance démographique est de 0,9 % en moyenne annuelle sur la même période.

Par ailleurs, les mailles peu tendues des couronnes périurbaines connaissent également une croissance significative, mais la réservce foncière de ces espaces contribue vraisemblablement à amoindrir le renforcement du degré de tension.

Figure : Taux de croissance annuel moyen (1999-2014) de la population

Source : Insee, RP, calculs SDES

LS0tDQp0aXRsZTogIjE4LDQlIGRlIGxhIHBvcHVsYXRpb24gcsOpc2lkZSBkYW5zIHVuIG1hcmNow6kgZHUgbG9nZW1lbnQgdGVuZHUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UNCi0tLQ0KDQo8IS0tIC0tLSAtLT4NCjwhLS0gdGl0bGU6ICJNYWlsbGUgaGFiaXRhdCA6IHVuZSBub3V2ZWxsZSBncmlsbGUgZGUgbGVjdHVyZSBkZXMgdGVycml0b2lyZXMgcG91ciBsZSBsb2dlbWVudCIgLS0+DQo8IS0tIG91dHB1dDogLS0+DQo8IS0tICAgd29yZF9kb2N1bWVudDogLS0+DQo8IS0tICAgICBmaWdfd2lkdGg6IDggLS0+DQo8IS0tICAgICBmaWdfaGVpZ2h0OiA4IC0tPg0KPCEtLSAgICAgZmlnX2NhcHRpb246IHRydWUgLS0+DQo8IS0tIC0tLSAtLT4NCg0KDQoNCjxzdHlsZT4gYm9keSB7dGV4dC1hbGlnbjoganVzdGlmeX0gIDwvc3R5bGU+DQoNCg0KDQoqKlByb3Bvc2l0aW9uIGQnYXZhbnQtcHJvcG9zIDoqKiBMZSBsb2dlbWVudCBlbnRyZXRpZW50IHVuIGxpZW4gb3JnYW5pcXVlIGF2ZWMgbGVzIHRlcnJpdG9pcmVzLiBJbCBlbiBlc3QgdW4gcsOpdsOpbGF0ZXVyLiBUb3V0IGTigJlhYm9yZCBlbiB0YW50IHF14oCZw6lsw6ltZW50IGTDqXRlcm1pbmFudCBkZSBsYSBwaHlzaW9ub21pZSBkZXMgZXNwYWNlcyBldCBkZSBsZXVyIG1vcnBob2xvZ2llLiBFbnN1aXRlLCBwYXJjZSBxdWUgcHLDqWNpc8OpbWVudCBhbmNyw6kgZGFucyB1biB0ZXJyaXRvaXJlLCwgbGUgbG9nZW1lbnQgc2Ugc2l0dWUgw6AgbGEgY3JvaXPDqWUgZGUgbm9tYnJldXNlcyBpbmZsdWVuY2VzIDogc2l0dWF0aW9uIGRlIGzigJllbXBsb2ksICBwcsOpc2VuY2UgZGUgc2VydmljZXMsIGFtw6luaXTDqXMgbmF0dXJlbGxlcyAgaW50ZXJ2aWVubmVudCBkYW5zIGxlcyBjaG9peCByw6lzaWRlbnRpZWxzIGRlcyBtw6luYWdlcywgZXQgY29udHJpYnVlbnQgYWluc2kgw6AgYXBwcsOpY2llciBvdSBkw6lwcsOpY2llciBzYSB2YWxldXIuDQoNCkNldHRlIMOpdHVkZSBwcm9wb3NlIHVuZSBhbmFseXNlIHN5c3TDqW1hdGlxdWUgZGVzIG1hcmNow6lzIGR1IGxvZ2VtZW50IGF1IHByaXNtZSBkZSBs4oCZYW5hbHlzZSB0ZXJyaXRvcmlhbGUgOiBxdWVsbGVzIHNvbnQgbGVzIGRpc3Bhcml0w6lzIHF1aSB0cmF2ZXJzZW50IGNlcyBtYXJjaMOpcyA/IFF1ZWxsZXMgZW4gc29udCBsZXMgdHJhamVjdG9pcmVzID8gUXVlbCBlc3QgbGUgZGVncsOpIGRlIGNvaMOpc2lvbiBkYW5zIGNlcyBlc3BhY2VzID8gQXV0YW50IGTigJnDqWzDqW1lbnRzIGTigJlhbmFseXNlIHF1aSBwZXJtZXR0ZW50IGRlIHJlcGxhY2VyIGxlIGxvZ2VtZW50IGF1IGPFk3VyIGRlcyBwcm9ibMOpbWF0aXF1ZXMgdGVycml0b3JpYWxlcyBldCBxdWkgb2ZmcmVudCB1bmUgZ3JpbGxlIGRlIGxlY3R1cmUgb3JpZ2luYWxlIGRlcyB0ZXJyaXRvaXJlcy4NCg0KTGUgbWFpbGxhZ2Ugc3VyIGxlcXVlbCBz4oCZYXBwdWllIGNldHRlIMOpdHVkZSBjb25zaXR1ZSBwYXIgYWlsbGV1cnMgdW4gbm91dmVsIG91dGlsIGTigJlhbmFseXNlIGRlcyB0ZXJyaXRvaXJlcywgZXQgY29tcGzDqHRlIGxlcyAqKm1haWxsYWdlcyBk4oCZw6l0dWRlcyoqIChwYXIgb3Bwb3NpdGlvbiBhdXggem9uYWdlcyByw6lnbGVtZW50YWlyZXMgY29tbWUgbGUgem9uYWdlQSxCLEMpIHByb3Bvc8OpcyBwYXIgbOKAmUluc2VlLiBJbCBwZXJtZXQgdW5lIGxlY3R1cmUgcGx1cyBjbGFpcmUgZGVzIGRpc3Bhcml0w6lzIHRlcnJpdG9yaWFsZXMgcHJvcHJlcyBhdSBsb2dlbWVudCDDoCBs4oCZw6ljaGVsbGUgbmF0aW9uYWxlLiBFbiByZXZhbmNoZSwgaWwgbmUgc2F1cmFpdCDDqnRyZSBhZGFwdMOpIGF1IHBvcnRhZ2UgZGUgcG9saXRpcXVlcyBwdWJsaXF1ZXMgZHUgbG9nZW1lbnQuDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9IA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSx3YXJuaW5nID0gRkFMU0UpIA0KcmVxdWlyZSh0aWR5dmVyc2UpDQpyZXF1aXJlKG1hcHRvb2xzKQ0KcmVxdWlyZShjYXJ0b2dyYW0pDQpyZXF1aXJlKHNwKQ0KcmVxdWlyZShjYXJ0b2dyYXBoeSkNCnJlcXVpcmUobGVhZmxldCkNCnJlcXVpcmUoRmFjdG9NaW5lUikNCnJlcXVpcmUoUkNvbG9yQnJld2VyKQ0KcmVxdWlyZShjb3JycGxvdCkNCnJlcXVpcmUoc2YpDQoNCmxvYWQoIkU6L0dFTzIwMTYvSGFiaWxsYWdlX0ZSLlJEYXRhIikNCmxvYWQoIi4uL2RhdC5SRGF0YSIpDQpjaG9peCA8LSAiem9uZV9pbnRlcl9mYWN0NDBfNDAwMDAiICAjIyMjIEEgY2hhbmdlciBwb3VyIGFuYWx5c2VyIHVuZSBhdXRyZSB2ZXJzaW9uICEhIQ0KbWFwIDwtIGxzdF96b25bW2dyZXAoY2hvaXgsbmFtZXMobHN0X3pvbikpXV0NCmFnIDwtIGxpc3RlX3pvbmFnZXNbW2dyZXAoY2hvaXgsbmFtZXMobGlzdGVfem9uYWdlcykpXV0NCm1hcCA8LSBtZXJnZShtYXAsYWcsYnkueD1jaG9peCxieS55PSJ6b25lIikNCnByb2o0c3RyaW5nKG1hcCkgPC0iK3Byb2o9bGNjICtsYXRfMT00NCArbGF0XzI9NDkuMDAwMDAwMDAwMDIgK2xhdF8wPTQ2LjUgK2xvbl8wPTMgK3hfMD03MDAwMDAgK3lfMD02NjAwMDAwICtlbGxwcz1HUlM4MCArdW5pdHM9bSArbm9fZGVmcyIgIyBMJ2luZm8gc3VyIGxhIHByb2plY3Rpb24gbidlc3QgcGFzIGRhbnMgbCdvYmpldCwgb24gbGEgcmVtZXQNCnJlcHJvaiA8LSAgc3BUcmFuc2Zvcm0obWFwLCAiK2luaXQ9ZXBzZzo0MzI2IikgIyMgT24gcmVwcm9qZXR0ZSBhdmVjIG1lcmNhdG9yIHBvdXIgTGVhZmxldA0KDQojYW5hIDwtIGNhcnRvZ3JhbShtYXAsIlAxNF9MT0ciLGl0ZXJtYXggPSAzKSAjIyBPbiBmYWl0IHVuIGZvbmRzIGFuYW1vcnBob3PDqSBlbiBmb25jdGlvbiBkdSBub21icmUgZGUgbG9nZW1lbnRzDQpkb24gPC0gc2VsZWN0KG1hcEBkYXRhLGluZGljLm1lbmFnLjE0LGluZGljLnJzLjE0LGluZGljLnZhYy4xNCxpbmRpYy5wcml4X3Jldi4xMiwNCiAgICAgICAgICAgICAgaW5kaWMuamV1bi4xNSxpbmRpYy50cmFuc2FjLjEyLGluZGljLnNvYy4xNSxpbmRpYy5zdXJvYy4xNSxpbmRpYy5kdXJvYy4xNSwNCiAgICAgICAgICAgICAgUDE0X0xPRyxQMTRfUE9QKQ0KDQpjbCA8LSBncm91cF9ieSh6b25hZ2VzLHpvbmVfaW50ZXJfZmFjdDQwXzQwMDAwLHR5cG9fbWFpbGxlKSAlPiUgDQogIHN1bW1hcmlzZSgpICU+JSANCiAgbXV0YXRlKGxpYl90eXBvX21haWxsZT1jYXNlX3doZW4odHlwb19tYWlsbGU9PTF+IjEgLSBNYWlsbGVzIGTDqXRlbmR1ZXMgXG4gw6AgZG9taW5hbnRlIHJ1cmFsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cG9fbWFpbGxlPT0yfiIyIC0gTWFpbGxlcyBwZXUgdGVuZHVlcyBcbiBkZXMgY291cm9ubmVzIHDDqXJpdXJiYWluZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBvX21haWxsZT09M34iMyAtIE1haWxsZXMgYXNzZXogdGVuZHVlcyBcbiBkZXMgcMO0bGVzIHVyYmFpbnMgZGUgcHJvdmluY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBvX21haWxsZT09NH4iNCAtIE1haWxsZXMgdGVuZHVlcyBkZXMgY291cm9ubmVzIFxuIGRlcyBhaXJlcyB1cmJhaW5lcyBhdHRyYWN0aXZlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cG9fbWFpbGxlPT01fiI1IC0gTWFpbGxlcyB0ZW5kdWVzIFxuIGRlcyBlc3BhY2VzIHRvdXJpc3RpcXVlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cG9fbWFpbGxlPT02fiI2IC0gTWFpbGxlcyDDoCBkaWZmaWN1bHTDqXMgXG4gcHJvbm9uY8OpZXMgZOKAmWFjY8OocyBhdSBsb2dlbWVudCIpKQ0KDQpjb2xzIDwtIGJyZXdlci5wYWwobiA9IDYsbmFtZSA9ICAiRGFyazIiKQ0KbSA8LSBtZXJnZShyZXByb2osY2wsYnkueD1jaG9peCxieS55PWNob2l4KQ0KbWFwIDwtIG1lcmdlKG1hcCxjbCxieS54PWNob2l4LGJ5Lnk9Y2hvaXgpDQojIENhbGN1bCBkZSBsYSBwb3B1bGF0aW9uIHBhciBjbHVzdGVyDQojIGFhIDwtIGdyb3VwX2J5KG1AZGF0YSxjbHVzdCkgJT4lIHN1bW1hcmlzZShwb3A9c3VtKFAxNF9QT1ApLGxvZz1zdW0oUDE0X0xPRykpIA0KIyB4dGFicyhhYSRwb3B+YWEkY2x1c3QpICU+JSBwcm9wLnRhYmxlKCkNCg0KDQoNCmBgYA0KDQoqKkludHJvZHVjdGlvbiA6KiogOiBsYSBtYWpvcml0w6kgZGVzIG1hcmNow6lzIGxvY2F1eCBkdSBsb2dlbWVudCBwcsOpc2VudGVudCB1bmUgaW5hZMOpcXVhdGlvbiBlbnRyZSBvZmZyZSBldCBkZW1hbmRlLiBE4oCZdW5lIHBhcnQsIGNlcnRhaW5zIG1hcmNow6lzLCBwcmluY2lwYWxlbWVudCBk4oCZw45sZSBkZSBGcmFuY2UsIHByw6lzZW50ZW50IHVuZSBkZW1hbmRlIGV4Y8OpZGVudGFpcmUsIHF1aSB0aXJlIGxlcyBwcml4IMOgIGxhIGhhdXNzZSA7IGxlcyBzaXR1YXRpb25zIGRlIHN1cm9jY3VwYXRpb24geSBzb250IMOpZ2FsZW1lbnQgcGx1cyBmcsOpcXVlbnRlcy4gROKAmWF1dHJlIHBhcnQsIGRhbnMgbGVzIGVzcGFjZXMgZGUgZmFpYmxlIGRlbnNpdMOpIGTDqW1vZ3JhcGhpcXVlLCBvbiB0cm91dmUgZGUgbm9tYnJldXggdGVycml0b2lyZXMgb8O5IGxlcyBwcml4IHNvbnQgdHLDqHMgbW9kw6lyw6lzIGV0IGxlcyBsb2dlbWVudHMgcGx1cyBzb3V2ZW50IHZhY2FudHMgZXQgbW9pbnMgcGV1cGzDqXMuIEVudHJlIGNlcyBkZXV4IGV4dHLDqm1lcywgbGVzIGVzcGFjZXMgcMOpcml1cmJhaW5zIGV0IGxlcyBjZW50cmUtdmlsbGVzIGRlcyBtw6l0cm9wb2xlcyBkZSBwcm92aW5jZSBwcsOpc2VudGVudCBkZXMgbWFyY2jDqXMgcGx1cyDDqXF1aWxpYnLDqXMgZXQgcGx1cyBob21vZ8OobmVzLg0KDQpBdSBmaWwgZHUgdGVtcHMsIGNlcyBzcMOpY2lmaWNpdMOpcyBzZSByZW5mb3JjZW50IGV0IGxlcyBtYXJjaMOpcyBkw6lqw6AgZW4gdGVuc2lvbiB2b2llbnQgbGV1cnMgZMOpc8OpcXVpbGlicmVzIHNlIHJlbmZvcmNlci4gQSBs4oCZaW52ZXJzZSwgbGUgcmFsZW50aXNzZW1lbnQgZMOpbW9ncmFwaGlxdWUgZXQgbGUgdmllaWxsaXNzZW1lbnQgw6AgbOKAmcWTdXZyZSBkYW5zIGxlcyBlc3BhY2VzIGZhaWJsZW1lbnQgcGV1cGzDqXMgY29udHJpYnVlbnQgw6AgbGEgZmFpYmxlIGR5bmFtaXF1ZSBkZXMgbWFyY2jDqXMgb8O5IGxhIGRlbWFuZGUgZXN0IGTDqWrDoCBtb2TDqXLDqWUuIFBhciBhaWxsZXVycywgY2VzIG1hcmNow6lzIHByw6lzZW50ZW50IHVuIGRlZ3LDqSBpbsOpZ2FsIGTigJlob21vZ8OpbsOpaXTDqSwgZXQgb24gdHJvdXZlIGTigJlhdmFudGFnZSBkZSBkaXZlcnNpdMOpIGVudHJlIGxlcyBjb21tdW5lcyBkZSBtYXJjaMOpcyBkZSBs4oCZRXN0IGRlIGxhIEZyYW5jZS4NCg0KDQojIExlcyBtYXJjaMOpcyBkdSBsb2dlbWVudCBzb250IGF2YW50IHRvdXQgY2FyYWN0w6lyaXPDqXMgcGFyIGxlIHBvdXZvaXIgZCdhY2hhdCBpbW1vYmlsaWVyIGRlcyBtw6luYWdlcw0KDQoqSW50cm9kdWN0aW9uIDogTmV1ZiBpbmRpY2F0ZXVycyBvbnQgw6l0w6kgbW9iaWxpc8OpcyBwb3VyIGTDqWNyaXJlIGxlcyBtYXJjaMOpcyBsb2NhdXggZHUgbG9nZW1lbnQuIFBhcm1pIGV1eCwgbGUgcG91dm9pciBk4oCZYWNoYXQgaW1tb2JpbGllciBldCBsZSBub21icmUgZGUgcGVyc29ubmVzIHBhciBtw6luYWdlIHNvbnQgY2V1eCBxdWkgcGVybWV0dGVudCBkZSBjb21wcmVuZHJlIGF1IG1pZXV4IGxlcyBkaXNwYXJpdMOpcyB0ZXJyaXRvcmlhbGVzIGVuIHRlcm1lcyBkZSBsb2dlbWVudCoNCg0KUG91ciByZW5kcmUgY29tcHRlIGRlIGzigJnDqXRhdCBkZXMgbWFyY2jDqXMgbG9jYXV4IGR1IGxvZ2VtZW50LCA5IGluZGljYXRldXJzIG9udCDDqXTDqSBzw6lsZWN0aW9ubsOpcyDDoCBs4oCZw6ljaGVsbGUgZGUgbGEgbWFpbGxlIGhhYml0YXQgKHZvaXIgZW5jYWRyw6lzKS4gUGFybWkgZXV4LCBsZSBwcml4IGR1IG1eMiBkYW5zIGzigJlhbmNpZW4gcmFwcG9ydMOpIGF1IHJldmVudSBtw6lkaWFuIGNvbW11bmFsLCBxdWkgbWVzdXJlIHBvdXIgbGVzIG3DqW5hZ2VzIGTigJl1bmUgY29tbXVuZSBkb25uw6llLCBsZSBub21icmUgZOKAmWFubsOpZXMgZGUgcmV2ZW51IG7DqWNlc3NhaXJlcyBwb3VyIGFjcXXDqXJpciAxMDAgJG1eMiQgZGFucyBjZXR0ZSBtw6ptZSBjb21tdW5lLCBlc3QgY2VsdWkgcG91ciBsZXF1ZWwgbOKAmWjDqXTDqXJvZ8OpbsOpaXTDqSBlc3QgbGEgcGx1cyBmb3J0ZSAoZmlndXJlIDEpLiBJbCBwZXJtZXQgZOKAmWFwcHJvY2hlciBsZXMgbWFyY2jDqXMgZHUgbG9nZW1lbnQgKMOgIHRyYXZlcnMgbGUgcHJpeCBhdSAkbV4yJCksIG1haXMgw6lnYWxlbWVudCBkZXMgY2FyYWN0w6lyaXN0aXF1ZXMgc29jaW9kw6ltb2dyYXBoaXF1ZXMgZGVzIG3DqW5hZ2VzIHF1aSBjb21wb3NlbnQgbGEgY29tbXVuZSwgw6AgdHJhdmVycyBsZXVyIHJldmVudSBtw6lkaWFuLiANCg0KTGEgcmVwcsOpc2VudGF0aW9uIGNhcnRvZ3JhcGhpcXVlIGRlIGNldCBpbmRpY2F0ZXVyIG1ldCB0b3V0IGTigJlhYm9yZCBlbiDDqXZpZGVuY2UgbGVzIGNlbnRyZXMgdXJiYWlucywgYWluc2kgcXVlIGxlcyBlc3BhY2VzIGxpdHRvcmF1eCwgZGUgbW9udGFnbmUsIG91IGVuY29yZSBmcm9udGFsaWVycy4gSWwgcsOpdsOobGUgbm9uIHNldWxlbWVudCBsZXMgbWFyY2jDqXMgZHUgbG9nZW1lbnQgb8O5IGxlcyBwcml4IGFic29sdXMgc29udCB0csOocyDDqWxldsOpcyAow45sZSBkZSBGcmFuY2UsIEdlbmV2b2lzIGZyYW7Dp2FpcywgbGl0dG9yYXV44oCmKSwgbWFpcyDDqWdhbGVtZW50IGNlcnRhaW5zIGVzcGFjZXMgb8O5LCBtYWxncsOpIGRlcyBwcml4IHJlbGF0aXZlbWVudCBtb2TDqXLDqXMsIGxlcyByZXZlbnVzIGRlcyBoYWJpdGFudHMgc29udCBwbHV0w7R0IGZhaWJsZXMsIGxldXIgcmVuZGFudCBhaW5zaSBs4oCZYWNjw6hzIGF1IGxvZ2VtZW50IGRpZmZpY2lsZSA7IGPigJllc3QgbGUgY2FzIHBhciBleGVtcGxlIHBvdXIgTWFyc2VpbGxlIG91IFJvdWJhaXguIERlcyBwaMOpbm9tw6huZXMgZGUgZ2VudHJpZmljYXRpb24gc29udCBzdXNjZXB0aWJsZXMgZOKAmcOqdHJlIMOgIGzigJnFk3V2cmUgZGFucyBjZXMgZXNwYWNlcy4NCg0KKipGaWd1cmUgOiBwb3V2b2lyIGQnYWNoYXQgaW1tb2JpbGllciBkZXMgbcOpbmFnZXMqKg0KYGBge3J9DQpjaG9yb0xheWVyKHNwZGY9bWFwLHZhcj0iaW5kaWMucHJpeF9yZXYuMTIiLGJvcmRlcj1OQSxsZWdlbmQudGl0bGUudHh0ID0gIlByaXggZHUgbTIgcmFwcG9ydMOpIFxuIGF1IHJldmVudSBcbiBtw6lkaWFuIixuY2xhc3MgPSA4LA0KICAgICAgICAgICBsZWdlbmQucG9zID0gInRvcGxlZnQiLGxlZ2VuZC52YWx1ZXMucm5kID0gMSkNCmhhYmlsbGUoKQ0KYGBgDQoNCipTb3VyY2VzIDogYmFzZXMgbm90YXJpYWxlcyBldCBGaWxvY29tLCBjYWxjdWxzIFNERVMqDQoNCkFwcsOocyBsZSBwb3V2b2lyIGTigJlhY2hhdCBpbW1vYmlsaWVyLCBsZXMgbWFyY2jDqXMgZHUgbG9nZW1lbnQgc2UgZGlzdGluZ3VlbnQgdHLDqHMgbmV0dGVtZW50IHBhciBsYSB0YWlsbGUgZGVzIG3DqW5hZ2VzICAoZmlndXJlIDIpIHF1aSBoYWJpdGVudCBsZXMgbG9nZW1lbnRzLCBlbiBsaWVuIGF2ZWMgbOKAmcOiZ2UgZGVzIHBvcHVsYXRpb25zIGRlIGNlcyBtYXJjaMOpcyBldCBsZXVyIHBvc2l0aW9uIGRhbnMgbGUgY3ljbGUgZGUgdmllLiBDZXQgaW5kaWNhdGV1ciBkw6ltb2dyYXBoaXF1ZSBlc3QgZXNzZW50aWVsIHBvdXIgY29tcHJlbmRyZSBsZXMgYmVzb2lucyBlbiBsb2dlbWVudCBhdXhxdWVscyBmb250IGZhY2UgbGVzIHRlcnJpdG9pcmVzLiBBaW5zaSwgZGFucyBsZXMgdmlsbGVzLWNlbnRyZSwgb8O5IGxhIHBvcHVsYXRpb24gZXN0IHBsdXMgamV1bmUsIG9uIHRyb3V2ZSBkZXMgbcOpbmFnZXMgcGx1cyBwZXRpdHMuIEEgbOKAmWludmVyc2UsIGRhbnMgbGVzIGNvdXJvbm5lcyBww6lyaXVyYmFpbmVzLCBvbiB0cm91dmUgZGVzIG3DqW5hZ2VzIGRlIHRhaWxsZSBpbXBvcnRhbnRlIDogY2Ugc29udCBsZXMgZXNwYWNlcyBvw7kgbGVzIGZhbWlsbGVzIGF2ZWMgZW5mYW50cyBzb250IGxlcyBwbHVzIG5vbWJyZXV4LiBFbmZpbiwgZGFucyBsZXMgZXNwYWNlcyBkZSBmYWlibGUgZGVuc2l0w6ksIGxlcyBtw6luYWdlcyBzb250IHBsdXMgcGV0aXRzLCBlbiBsaWVuIGF2ZWMgbGUgdmllaWxsaXNzZW1lbnQgcXVpIHkgZXN0IMOpZ2FsZW1lbnQgb2JzZXJ2w6kuDQoNCioqRmlndXJlIDogbm9tYnJlIGRlIHBlcnNvbm5lcyBwYXIgbcOpbmFnZSoqDQoNCmBgYHtyfQ0KY2hvcm9MYXllcihzcGRmPW1hcCx2YXI9ImluZGljLm1lbmFnLjE0Iixib3JkZXI9TkEsbGVnZW5kLnRpdGxlLnR4dCA9ICJOb21icmUgZGUgcGVyc29ubmVzIFxuIHBhciBtw6luYWdlIixuY2xhc3MgPSA4LGxlZ2VuZC52YWx1ZXMucm5kID0gMixsZWdlbmQucG9zID0gInRvcGxlZnQiKQ0KaGFiaWxsZSgpDQpgYGANCg0KKlNvdXJjZXMgOiBSUDIwMTQsIGNhbGN1bHMgU0RFUyoNCg0KKipFbmNhZHLDqSA6IG5ldWYgaW5kaWNhdGV1cnMgcG91ciBkw6ljcmlyZSBsZXMgbWFyY2jDqXMgZHUgbG9nZW1lbnQqKg0KDQpQb3VyIGNvbnN0cnVpcmUgZXQgYW5hbHlzZXIgbGVzIG1haWxsZXMgbG9nZW1lbnQsIGxlIFNERVMgYSDDqXRhYmxpIHVuZSBsaXN0ZSBkZSBuZXVmIGluZGljYXRldXJzIMOgIGxhIG1haWxsZSBjb21tdW5hbGUuIENlcyBkZXJuaWVycyBwZXJtZXR0ZW50IGRlIHByZW5kcmUgZW4gY29tcHRlIGxlcyBzcMOpY2lmaWNpdMOpcyBkZXMgdGVycml0b2lyZXMgZW4gbWF0acOocmUgZGUgbG9nZW1lbnQsIGV0IHNvbnQgcGV1IGNvcnLDqWzDqXMgbGVzIHVucyBhdXggYXV0cmVzLiBMYSBkZXNjcmlwdGlvbiBkZSBjZXMgaW5kaWNhdGV1cnMgZmlndXJlIGRhbnMgbGUgcmFwcG9ydCBtw6l0aG9kb2xvZ2lxdWUgICoqUkVGRVJFTkNFIEEgQUpPVVRFUioqDQoNCi0gTCdpbmRpY2F0ZXVyIGRlIGpldW5lc3NlIGR1IHBhcmMgOiBwYXJ0IGRlcyBsb2dlbWVudCByw6ljZW50cyAoY29uc3RydWl0cyBhcHLDqHMgMTk3NSkgcmFwcG9ydMOpcyDDoCBsYSBwYXJ0IGRlcyBsb2dlbWVudHMgYW5jaWVucyAoY29uc3RydWl0cyBhdmFudCAxOTQ5KS4gDQotIER1csOpZSBkJ29jY3VwYXRpb24gbcOpZGlhbmUgZGVzIGxvZ2VtZW50cw0KLSBUYXV4IGRlIHRyYW5zYWN0aW9ucyBkYW5zIGxlIG1hcmNow6kgZGUgbCdhbmNpZW4gKG5vbWJyZSBkZSB0cmFuc2FjdGlvbnMgcmFwcG9ydMOpIGF1IG5vbWJyZSBkZSBsb2dlbWVudHMpDQotIFBhcnQgZGUgbG9nZW1lbnRzIHNvY2lhdXgNCi0gUGFydCBkZSBsb2dlbWVudHMgZW4gc2l0dWF0aW9uIGRlIHN1cm9jY3VwYXRpb24NCi0gUHJpeCBhdSAkbV4yJCBkYW5zIGwnYW5jaWVuIHJhcHBvcnTDqXMgYXUgcmV2ZW51IG3DqWRpYW4gY29tbXVuYWwNCi0gTm9tYnJlIGRlIHBlcnNvbm5lcyBwYXIgbcOpbmFnZQ0KLSBQYXJ0IGRlcyByw6lzaWRlbmNlcyBzZWNvbmRhaXJlcw0KLSBQYXJ0IGRlIGxvZ2VtZW50cyB2YWNhbnRzDQoNCioqRmluIGVuY2FkcsOpKioNCg0KYGBge3J9DQpjaG9yb0xheWVyKHNwZGY9bWFwLHZhcj0iaW5kaWMucnMuMTQiLGJvcmRlcj1OQSxsZWdlbmQudGl0bGUudHh0ID0gIlBhcnQgZGUgcsOpc2lkZW5jZXMgXG4gc2Vjb25kYWlyZXMiLG5jbGFzcyA9IDgsbGVnZW5kLnZhbHVlcy5ybmQgPSAyLGxlZ2VuZC5wb3MgPSAidG9wbGVmdCIpDQpoYWJpbGxlKCkNCmBgYA0KDQoNCkxhIHBhcnQgZGUgcsOpc2lkZW5jZXMgc2Vjb25kYWlyZXMgZmFpdCDDqWdhbGVtZW50IGFwcGFyYcOudHJlIGTigJlpbXBvcnRhbnRlcyBkaXNwYXJpdMOpcyB0ZXJyaXRvcmlhbGVzIDogbGVzIGVzcGFjZXMgdXJiYWlucyBzb250IGVuIGVmZmV0IHRyw6hzIHBldSBwb3VydnVzIGVuIHLDqXNpZGVuY2VzIHNlY29uZGFpcmVzLCBub3RhbW1lbnQgbGVzIGNvdXJvbm5lcyBww6lyaXVyYmFpbmVzLiBMZXMgcGFydHMgbGVzIHBsdXMgw6lsZXbDqWVzIGRlIHLDqXNpZGVuY2VzIHNlY29uZGFpcmVzIHNlIHRyb3V2ZW50IGRhbnMgbGVzIGVzcGFjZXMgZGUgZmFpYmxlIGRlbnNpdMOpIGTDqW1vZ3JhcGhpcXVlLCBwYXJtaSBsZXNxdWVscyBsZXMgem9uZXMgZGUgbW9udGFnbmUgKEFscGVzLCBQeXLDqW7DqWVzLCBDb3JzZSkuIExlcyBlc3BhY2VzIHVyYmFpbnMgZGVzIGxpdHRvcmF1eCBjb21wdGVudCDDqWdhbGVtZW50IHVuZSBwYXJ0IGltcG9ydGFudGUgZGUgY2UgdHlwZSBkZSBsb2dlbWVudHMuIENlIHNvbnQgZG9uYywgZGUgbWFuacOocmUgZ8OpbsOpcmFsZSwgbGVzIGVzcGFjZXMgw6Agdm9jYXRpb24gdG91cmlzdGlxdWVzIHF1aSBzb250IG1pcyBlbiBleGVyZ3VlIHBhciBsYSBjYXJ0b2dyYXBoaWUgZGUgY2V0IGluZGljYXRldXIuDQoNCkxlcyBtYXJjaMOpcyBkdSBsb2dlbWVudCBwcsOpc2VudGVudCBkZXMgZGlzcGFyaXTDqXMgcHJvbm9uY8OpZXMgc3VyIGxlcyA3IGF1dHJlcyBpbmRpY2F0ZXVycywgbWFpcyBkYW5zIHVuZSBtb2luZHJlIG1lc3VyZS4gSWxzIHBlcm1ldHRlbnQgdG91dGVmb2lzIGRlIGTDqWdhZ2VyIGRlcyB0eXBlcyBkZSBtYXJjaMOpcyBkdSBsb2dlbWVudCBkb250IGxlcyBjYXJhY3TDqXJpc3RpcXVlcyBkw6lwYXNzZW50IGNlcyB0cm9pcyBzZXVsZXMgZGltZW5zaW9ucyBxdWUgc29udCBsZSBwb3V2b2lyIGTigJlhY2hhdCBpbW1vYmlsaWVyLCBsYSB0YWlsbGUgZGVzIG3DqW5hZ2VzIGV0IGxlIHBvaWRzIGRlcyByw6lzaWRlbmNlcyBzZWNvbmRhaXJlcyBkYW5zIGxlIHBhcmMuDQoNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3QobWFwLGJvcmRlcj1OQSkNCnBsb3Qoc3RfZ2VvbWV0cnkobnV0cyksY29sPSJsaWdodGdyZXkiLGJvcmRlcj0id2hpdGUiLGFkZD1UKQ0KY2hvcm9MYXllcihzcGRmPW1hcCx2YXI9ImluZGljLnZhYy4xNCIsYm9yZGVyPU5BLGxlZ2VuZC50aXRsZS50eHQgPSAiUGFydCBkZSBsb2dlbWVudHMgdmFjYW50cyIsbmNsYXNzID0gNixsZWdlbmQudmFsdWVzLnJuZCA9IDAsbGVnZW5kLnBvcyA9ICJ0b3BsZWZ0IixhZGQ9VCkNCnBsb3Qoc3RfZ2VvbWV0cnkoc3RfY2VudHJvaWQobGFiZWxzKSksYWRkPVQscGNoPTE1KQ0KbGFiZWxMYXllcih4PWRlY2FsZSx0eHQ9ImxpYmdlbyIpDQoNCnBsb3QobWFwLGJvcmRlcj1OQSkNCnBsb3Qoc3RfZ2VvbWV0cnkobnV0cyksY29sPSJsaWdodGdyZXkiLGJvcmRlcj0id2hpdGUiLGFkZD1UKQ0KY2hvcm9MYXllcihzcGRmPW1hcCx2YXI9ImluZGljLmpldW4uMTUiLGJvcmRlcj1OQSxsZWdlbmQudGl0bGUudHh0ID0gIkluZGljZSBkZSBqZXVuZXNzZSBkdSBwYXJjIixuY2xhc3MgPSA2LGxlZ2VuZC52YWx1ZXMucm5kID0gMCxsZWdlbmQucG9zID0gInRvcGxlZnQiLGFkZD1UKQ0KcGxvdChzdF9nZW9tZXRyeShzdF9jZW50cm9pZChsYWJlbHMpKSxhZGQ9VCxwY2g9MTUpDQpsYWJlbExheWVyKHg9ZGVjYWxlLHR4dD0ibGliZ2VvIikNCg0KcGxvdChtYXAsYm9yZGVyPU5BKQ0KcGxvdChzdF9nZW9tZXRyeShudXRzKSxjb2w9ImxpZ2h0Z3JleSIsYm9yZGVyPSJ3aGl0ZSIsYWRkPVQpDQpjaG9yb0xheWVyKHNwZGY9bWFwLHZhcj0iaW5kaWMuZHVyb2MuMTUiLGJvcmRlcj1OQSxsZWdlbmQudGl0bGUudHh0ID0gIkR1csOpZSBkJ29jY3VwYXRpb24gbW95ZW5uZSIsbmNsYXNzID0gNixsZWdlbmQudmFsdWVzLnJuZCA9IDIsbGVnZW5kLnBvcyA9ICJ0b3BsZWZ0IixhZGQ9VCkNCnBsb3Qoc3RfZ2VvbWV0cnkoc3RfY2VudHJvaWQobGFiZWxzKSksYWRkPVQscGNoPTE1KQ0KbGFiZWxMYXllcih4PWRlY2FsZSx0eHQ9ImxpYmdlbyIpDQoNCnBsb3QobWFwLGJvcmRlcj1OQSkNCnBsb3Qoc3RfZ2VvbWV0cnkobnV0cyksY29sPSJsaWdodGdyZXkiLGJvcmRlcj0id2hpdGUiLGFkZD1UKQ0KY2hvcm9MYXllcihzcGRmPW1hcCx2YXI9ImluZGljLnN1cm9jLjE1Iixib3JkZXI9TkEsbGVnZW5kLnRpdGxlLnR4dCA9ICJQYXJ0IGRlcyBsb2dlbWVudHMgXG4gZW4gc3Vyb2NjdXBhdGlvbiIsbmNsYXNzID0gOCxsZWdlbmQudmFsdWVzLnJuZCA9IDEsbGVnZW5kLnBvcyA9ICJ0b3BsZWZ0IixhZGQ9VCkNCnBsb3Qoc3RfZ2VvbWV0cnkoc3RfY2VudHJvaWQobGFiZWxzKSksYWRkPVQscGNoPTE1KQ0KbGFiZWxMYXllcih4PWRlY2FsZSx0eHQ9ImxpYmdlbyIpDQoNCnBsb3QobWFwLGJvcmRlcj1OQSkNCnBsb3Qoc3RfZ2VvbWV0cnkobnV0cyksY29sPSJsaWdodGdyZXkiLGJvcmRlcj0id2hpdGUiLGFkZD1UKQ0KY2hvcm9MYXllcihzcGRmPW1hcCx2YXI9ImluZGljLnNvYy4xNSIsYm9yZGVyPU5BLGxlZ2VuZC50aXRsZS50eHQgPSAiUGFydCBkZSBsb2dlbWVudHMgc29jaWF1eCIsbmNsYXNzID0gNixsZWdlbmQudmFsdWVzLnJuZCA9IDAsbGVnZW5kLnBvcyA9ICJ0b3BsZWZ0IixhZGQ9VCkNCnBsb3Qoc3RfZ2VvbWV0cnkoc3RfY2VudHJvaWQobGFiZWxzKSksYWRkPVQscGNoPTE1KQ0KbGFiZWxMYXllcih4PWRlY2FsZSx0eHQ9ImxpYmdlbyIpDQoNCnBsb3QobWFwLGJvcmRlcj1OQSkNCnBsb3Qoc3RfZ2VvbWV0cnkobnV0cyksY29sPSJsaWdodGdyZXkiLGJvcmRlcj0id2hpdGUiLGFkZD1UKQ0KY2hvcm9MYXllcihzcGRmPW1hcCx2YXI9ImluZGljLnRyYW5zYWMuMTIiLGJvcmRlcj1OQSxsZWdlbmQudGl0bGUudHh0ID0gIlRhdXggZGUgdHJhbnNhY3Rpb25zIixuY2xhc3MgPSA2LGxlZ2VuZC52YWx1ZXMucm5kID0gMSxsZWdlbmQucG9zID0gInRvcGxlZnQiLGFkZD1UKQ0KcGxvdChzdF9nZW9tZXRyeShzdF9jZW50cm9pZChsYWJlbHMpKSxhZGQ9VCxwY2g9MTUpDQpsYWJlbExheWVyKHg9ZGVjYWxlLHR4dD0ibGliZ2VvIikNCg0KYGBgDQoNCg0KDQojIFNpeCB0eXBlcyBkZSBtYXJjaMOpcyBkdSBsb2dlbWVudA0KDQoqSW50cm9kdWN0aW9uIDogIExlcyBtYXJjaMOpcyBkdSBsb2dlbWVudCBwZXV2ZW50IMOqdHJlIHJlZ3JvdXDDqXMgZW4gNiBncmFuZGVzIGNhdMOpZ29yaWVzIHJldHJhw6dhbnQgZXNzZW50aWVsbGVtZW50IGxlcyBkaXNwYXJpdMOpcyBlbiB0ZXJtZXMgZGUgdGVuc2lvbiwgZGUgdGFpbGxlIGRlcyBtw6luYWdlcywgZOKAmWFuY2llbm5ldMOpIGV0IGRlIGNvbXBvc2l0aW9uIGR1IHBhcmMuIENlcyBjYXTDqWdvcmllcyByZWNvdXZyZW50IGRlcyByw6lhbGl0w6lzIHRlcnJpdG9yaWFsZXMgYmllbiBkw6lmaW5pZXMqDQoNCkNlcyBkaXNwYXJpdMOpcyBwZXJtZXR0ZW50IGRlIHJlZ3JvdXBlciBsZXMgbWFyY2jDqXMgZHUgbG9nZW1lbnQgZW4gNiBncmFuZHMgdHlwZXMgYXV4IGNhcmFjdMOpcmlzdGlxdWVzIHRyw6hzIGRpc3RpbmN0ZXMgOg0KDQotIENsYXNzZSAxIDogTWFpbGxlcyBkw6l0ZW5kdWVzIMOgIGRvbWluYW50ZSBydXJhbGUuIExlcyBtYWlsbGVzIGFwcGFydGVuYW50IMOgIGNldHRlIGNhdMOpZ29yaWUgc29udCBtYXJxdcOpZXMgcGFyIGxlcyBwcml4IHJlbGF0aWZzIGxlcyBwbHVzIGJhcyAoZmlndXJlIDMpOyBwYXJhbGzDqGxlbWVudCwgbGUgdGF1eCBkZSB2YWNhbmNlIHkgZXN0IGxlIHBsdXMgw6lsZXbDqSBldCBsZSBwYXJjIGxlIHBsdXMgYW5jaWVuLiBMZXMgbcOpbmFnZXMgeSBzb250IMOpZ2FsZW1lbnQgcGx1cyBwZXRpdHMsIGV0IGxhIGR1csOpZSBk4oCZb2NjdXBhdGlvbiBkZXMgbG9nZW1lbnRzIGVzdCBwbHVzIMOpbGV2w6llIHF1ZSBsYSBtb3llbm5lLiBMZXMgbWFpbGxlcyBkZSBjZXR0ZSBjbGFzc2Ugc2UgdHJvdXZlbnQgZXNzZW50aWVsbGVtZW50IGRhbnMgbGVzIGVzcGFjZXMgZGUgZmFpYmxlIGRlbnNpdMOpLCBob3JzIGRlcyB6b25lcyBkZSBtb250YWduZSwgcHJpbmNpcGFsZW1lbnQgbGUgbG9uZyBkZSBsYSBkaWFnb25hbGUgTm9yZC1Fc3QgLyBTdWQtT3Vlc3QgKGZpZ3VyZSA0KS4gTGV1ciBlbXByZWludGUgc3VyIGxlIHRlcnJpdG9pcmUgZXN0IGltcG9ydGFudGUgZW4gdGVybWVzIGRlIHN1cGVyZmljaWUsIG1haXMgY2VzIG1haWxsZXMgcmVncm91cGVudCB1biBwZXUgbW9pbnMgZGUgMTkgJSBkZSBsYSBwb3B1bGF0aW9uLg0KDQotIENsYXNzZSAyIDogTWFpbGxlcyBwZXUgdGVuZHVlcyBkZXMgY291cm9ubmVzIHDDqXJpdXJiYWluZXMuIExlcyBtw6luYWdlcyBzb250IHBsdXTDtHQgZGUgZ3JhbmRlIHRhaWxsZSwgbGEgdmFjYW5jZSB5IGVzdCBmYWlibGUuIENlIGdyb3VwZSBlc3QgbGUgcGx1cyBwcm9jaGUgZGUgbGEgbW95ZW5uZSBzdXIgbOKAmWVuc2VtYmxlIGRlcyBpbmRpY2F0ZXVycy4gTGVzIHByaXggeSBzb250IG1vZMOpcsOpcyByZWxhdGl2ZW1lbnQgYXV4IHJldmVudXMsIGV0IGxhIGR1csOpZSBk4oCZb2NjdXBhdGlvbiBwbHV0w7R0IMOpbGV2w6llLiBMYSBzdXItb2NjdXBhdGlvbiBkZXMgbG9nZW1lbnRzIGV0IGxlIHRhdXggZGUgdmFjYW5jZXMgc29udCBldXggZW4gcmV0cmFpdC4gQ2VzIG1haWxsZXMgc2Ugc2l0dWVudCBlc3NlbnRpZWxsZW1lbnQgZW4gcMOpcmlwaMOpcmllIGRlcyBwcmluY2lwYWxlcyBhaXJlcyB1cmJhaW5lcyBldCBkZXNzaW5lbnQgbGUgcsOpc2VhdSBpbnRlci11cmJhaW4gOyBQcsOocyBkZSAyOSAlIGRlIGxhIHBvcHVsYXRpb24geSByw6lzaWRlLg0KDQotIENsYXNzZSAzIDogTWFpbGxlcyBhc3NleiB0ZW5kdWVzIGRlcyBww7RsZXMgdXJiYWlucyBkZSBwcm92aW5jZS4gQ2V0dGUgY2xhc3NlIGRlIG1haWxsZXMgcHLDqXNlbnRlbnQgdW4gcG91dm9pciBk4oCZYWNoYXQgaW1tb2JpbGllciB1biBwZXUgZW4gcmV0cmFpdCBwYXIgcmFwcG9ydCBhdXggZGV1eCBwcsOpY8OpZGVudGVzLCBwcm9jaGUgZGUgbGEgbW95ZW5uZSBuYXRpb25hbGUuIEVuIHJldmFuY2hlLCBsZXMgbcOpbmFnZXMgeSBzb250IHNpZ25pZmljYXRpdmVtZW50IHBsdXMgcGV0aXRzIGV0IGxhIGR1csOpZSBk4oCZb2NjdXBhdGlvbiBlbiByZXRyYWl0LiBDZXMgbWFpbGxlcyBjb21wdGVudCByZWxhdGl2ZW1lbnQgcGx1cyBkZSBsb2dlbWVudHMgc29jaWF1eCBxdWUgbGVzIGRldXggdHlwZXMgcHLDqWPDqWRlbnRzLiBEZSBmYWl0LCBvbiBsZXMgdHJvdXZlIGF1IGPFk3VyIGRlcyBhaXJlcyB1cmJhaW5lcyBkZSBwcm92aW5jZXMgOiBjZSBzb250IGRvbmMgZGVzIGVzcGFjZXMgdXJiYWlucywgb8O5IGxhIHBvcHVsYXRpb24gZXN0IHBsdXMgamV1bmUsIGRvbmMgYXZlYyB1bmUgcGx1cyBmYWlibGUgcHJvcG9ydGlvbiBkZSBmYW1pbGxlcywgY2UgcXVpIGV4cGxpcXVlIGxhIGZhaWJsZSB0YWlsbGUgZGVzIG3DqW5hZ2VzIGV0IGxlIHR1cm5vdmVyIHBsdXMgaW1wb3J0YW50LiBFbnZpcm9uIHVuIHF1YXJ0IGRlIGxhIHBvcHVsYXRpb24gZXN0IHJlZ3JvdXDDqWUgZGFucyBjZXR0ZSBjbGFzc2UuDQoNCg0KKipGaWd1cmUgOiBFY2FydCDDoCBsYSBtb3llbm5lIHNlbG9uIGxhIGNsYXNzZSAqKg0KYGBge3J9DQpudW0gPC0gc2VsZWN0X2lmKG1AZGF0YSxpcy5udW1lcmljKSAlPiUgc2NhbGUoKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQpkb25fY2wgPC0gZGF0YS5mcmFtZShjbGFzc2U9cGFzdGUoIkNsYXNzZSIsbUBkYXRhJHR5cG9fbWFpbGxlKSxudW0pICU+JSANCiAgICAgICAgICBzZWxlY3QoaW5kaWMubWVuYWcuMTQsaW5kaWMucnMuMTQsaW5kaWMudmFjLjE0LGluZGljLnByaXhfcmV2LjEyLGluZGljLmpldW4uMTUsDQogICAgICAgICAgICAgICAgIGluZGljLnRyYW5zYWMuMTIsDQogICAgICAgICAgICAgICAgIGluZGljLnNvYy4xNSxpbmRpYy5zdXJvYy4xNSxpbmRpYy5kdXJvYy4xNSxjbGFzc2UpDQojIE9uIHJlbm9tbWUgbGVzIHZhcmlhYmxlcyBwb3VyIGZhaXJlIHVuIGpvbGkgZ3JhcGhpcXVlDQpuYW1lcyhkb25fY2wpWzE6OV0gPC0gYygiTmIgcGVycyBwYXIgbcOpbmFnZXMiLCJQYXJ0IHLDqXNpZC4gc2Vjb25kYWlyZXMiLCJQYXJ0IGxvZyB2YWNhbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJQcml4IGxvZyByYXBwb3J0w6lzIGF1eCByZXZlbnVzIiwiSW5kaWNlIGpldW5lc3NlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJUYXV4IHRyYW5zYWN0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUGFydCBsb2cgc29jaWF1eCIsIlN1cm9jY3VwYXRpb24iLCJEdXLDqWUgb2NjdXBhdGlvbiIpDQpkb25fY2wgPC0gZ3JvdXBfYnkoZG9uX2NsLGNsYXNzZSkgICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLG1lZGlhbixuYS5ybT1UKSAlPiUNCiAgICAgICAgICBnYXRoZXIoLWNsYXNzZSxrZXk9InZhciIsdmFsdWU9IkVjYXJ0IikNCmdncGxvdChkb25fY2wsYWVzKGNsYXNzZSx2YXIsZmlsbD1FY2FydCkpICsgZ2VvbV90aWxlKCkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSJyZWQiLGhpZ2g9ImJsdWUiKSArIHhsYWIoIkNhdMOpZ29yaWUiKSArIHlsYWIoIkluZGljYXRldXIiKQ0KYGBgIA0KDQoqU291cmNlcyA6IENhbGN1bHMgU0RFUyoNCg0KLSBDbGFzc2UgNCA6IE1haWxsZXMgdGVuZHVlcyBkZXMgY291cm9ubmVzIGRlcyBhaXJlcyB1cmJhaW5lcyBhdHRyYWN0aXZlcy4gIENlcyBtYWlsbGVzIHNvbnQgZW4gdHLDqHMgcGV0aXQgbm9tYnJlLCBtYWlzIHNvbnQgdHLDqHMgc3DDqWNpZmlxdWUgOiBsZSBwYXJjIGRlIGxvZ2VtZW50IHkgZXN0IHRyw6hzIHLDqWNlbnQgcGFyIHJhcHBvcnQgYXV4IGF1dHJlcyBldCBsZSBwb3V2b2lyIGTigJlhY2hhdCBlbiByZXRyYWl0IHBhciByYXBwb3J0IGF1eCAzIGNsYXNzZXMgcHLDqWPDqWRlbnRlcy4gUGFyIGFpbGxldXJzLCBsYSB0YWlsbGUgZGVzIG3DqW5hZ2VzIGVzdCBwbHV0w7R0IGltcG9ydGFudGUgZXQgbGEgc3VyLW9jY3VwYXRpb24gbmV0dGVtZW50IGVuIHJldHJhaXQuIEVsbGVzIHNlIHNpdHVlbnQgZGFucyBsZXMgZXNwYWNlcyBww6lyaXVyYmFpbnMgcHJvY2hlcyBkZXMgYWlyZXMgdXJiYWluZXMgZG9udCBsYSBwb3B1bGF0aW9uIGEgZm9ydGVtZW50IGNyw7sgY2VzIGRlcm5pw6hyZXMgYW5uw6llcy4gUGFyIGV4ZW1wbGUsIG9uIHkgdHJvdXZlIGzigJllbnRpw6hyZSBiYW5saWV1ZSBkZSBUb3Vsb3VzZSwgbWFpcyDDqWdhbGVtZW50IGxhIHDDqXJpcGjDqXJpZSBvdWVzdCBkZSBCb3JkZWF1eCBvdSBlbmNvcmUgbOKAmWVzdCBkZSBMeW9uLiBM4oCZYXR0cmFjdGl2aXTDqSByw6lzaWRlbnRpZWxsZSBkZSBjZXMgbWFpbGxlcyBhIGRvbmMgY29uZHVpdCDDoCBkZXMgZmx1eCBkZSBjb25zdHJ1Y3Rpb24gZGUgbG9nZW1lbnRzIGltcG9ydGFudHMsIG1haXMgc+KAmWVzdCDDqWdhbGVtZW50IHRyYWR1aXQgcGFyIHVuIGFjY3JvaXNzZW1lbnQgZGVzIHByaXguIEVsbGVzIHJlZ3JvdXBlbnQgc2V1bGVtZW50IDIlIGRlIGxhIHBvcHVsYXRpb24uDQoNCi0gQ2xhc3NlIDUgOiBNYWlsbGVzIHRlbmR1ZXMgZGVzIGVzcGFjZXMgdG91cmlzdGlxdWVzLiBDZXR0ZSBjbGFzc2UgcHLDqXNlbnRlIGF2YW50IHRvdXQgdW4gcG91dm9pciBk4oCZYWNoYXQgaW1tb2JpbGllciBlbiByZXRyYWl0IDogbGVzIHByaXggeSBzb250IMOpbGV2w6lzIHJlbGF0aXZlbWVudCBhdXggcmV2ZW51cyBkZXMgaGFiaXRhbnRzIGV0IHVuIHRhdXggZGUgc3VyLW9jY3VwYXRpb24gcGx1cyDDqWxldsOpLiBMYSBjYXJhY3TDqXJpc3RpcXVlIHByaW5jaXBhbGUgZXN0IGF2YW50IHRvdXQgbGEgZm9ydGUgcGFydCBkZSByw6lzaWRlbmNlcyBzZWNvbmRhaXJlcyBxdeKAmW9uIHkgdHJvdXZlLiBEZSBmYWl0LCBjZXMgbWFpbGxlcyBzZSBzaXR1ZW50IGRhbnMgbGVzIGVzcGFjZXMgw6Agdm9jYXRpb24gdG91cmlzdGlxdWUsIGxpdHRvcmF1eCBldCBtb250YWduYXJkcy4gTGUgbWFyY2jDqSBkZXMgcsOpc2lkZW5jZXMgc2Vjb25kYWlyZSB5IHBvdXNzZSBsZXMgcHJpeCDDoCBsYSBoYXVzc2UgZXQgYWNjcm/DrnQgbGUgZMOpY2FsYWdlIGF2ZWMgbGVzIHJldmVudXMgZGVzIHLDqXNpZGVudHMsIGNlIHF1aSBsZXVyIGNvbmbDqHJlIGxlcyBjYXJhY3TDqXJpc3RpcXVlcyBkZSBtYXJjaMOpcyB0ZW5kdXMuIENlcyBtYWlsbGVzIHJlZ3JvdXBlbnQgZW52aXJvbiA3JSBkZSBsYSBwb3B1bGF0aW9uLg0KDQoNCi0gQ2xhc3NlIDYgOiBNYWlsbGVzIMOgIGRpZmZpY3VsdMOpcyBwcm9ub25jw6llcyBk4oCZYWNjw6hzIGF1IGxvZ2VtZW50LiBDZSBkZXJuaWVyIGdyb3VwZSBjb250aWVudCBsZXMgbWFyY2jDqXMgbGVzIHBsdXMgdGVuZHVzIDogbGUgcG91dm9pciBk4oCZYWNoYXQgaW1tb2JpbGllciB5IGVzdCBuZXR0ZW1lbnQgZW4gcmV0cmFpdCwgZXQgbGUgdGF1eCBkZSBzdXItb2NjdXBhdGlvbiBkZXMgbG9nZW1lbnRzIGVzdCDDqWxldsOpLCB0b3V0IGNvbW1lIGxlIG5vbWJyZSBkZSBwZXJzb25uZXMgcGFyIG3DqW5hZ2VzLiBPbiB5IHRyb3V2ZSDDqWdhbGVtZW50IGxhIHBsdXMgZm9ydGUgcHJvcG9ydGlvbiBkZSBsb2dlbWVudHMgc29jaWF1eC4gQ2VzIG1haWxsZXMgY29ycmVzcG9uZGVudCBhdXggbWFyY2jDqXMgdGVuZHVzIGTigJnDjmxlIGRlIEZyYW5jZSwgYWluc2kgcXVlIGNldXggb8O5IGxlIHBvdXZvaXIgZOKAmWFjaGF0IGltbW9iaWxpZXIgZGVzIG3DqW5hZ2VzIGVzdCBlbiByZXRyYWl0IGR1IGZhaXQgZGUgZmFpYmxlcyByZXZlbnVzIChSb3ViYWlzLCBNYXJzZWlsbGUpLiAxOCw0JSBkZSBsYSBwb3B1bGF0aW9uIHLDqXNpZGUgZGFucyBjZXMgbWFyY2jDqXMgZG9udCBs4oCZZW1wcmVpbnRlIGfDqW9ncmFwaGlxdWUgZXN0IHRvdXRlZm9pcyB0csOocyByZXN0cmVpbnRlLg0KDQoNCioqRmlndXJlIDogTGVzIDYgdHlwZXMgZGUgbWFyY2jDqXMgZHUgbG9nZW1lbnQgKioNCg0KYGBge3J9DQpjbGFzc2UgPC0gbSRsaWJfdHlwb19tYWlsbGUNCmxlYWYuY29sIDwtIGNvbG9yRmFjdG9yKHBhbGV0dGUgPSBjb2xzLCBjbGFzc2UpDQojIFZlcnNpb24gbGVhZmxldA0KbGVhZmxldChkYXRhPW0pICU+JQ0KICAgIGFkZFRpbGVzKGF0dHJpYnV0aW9uID0gIlNMQzMiKSAlPiUNCiAgICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKSAlPiUNCiAgICBhZGRMZWdlbmQocGFsID0gbGVhZi5jb2wsIHZhbHVlcyA9IGNsYXNzZSwgb3BhY2l0eSA9IDEscG9zaXRpb24gPSAiYm90dG9tbGVmdCIpICU+JQ0KICAgIGFkZFBvbHlnb25zKHN0cm9rZSA9IFQsY29sb3I9bGVhZi5jb2woY2xhc3NlKSx3ZWlnaHQgPSAxLGZpbGxPcGFjaXR5ID0gLjUsb3BhY2l0eSA9IDMsDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAyLGJyaW5nVG9Gcm9udCA9IFRSVUUpLA0KICAgICAgICAgICAgICAgIHBvcHVwPWNsYXNzZSkNCg0KIyBWZXJzaW9uIHN0YXRpcXVlDQojIG9yZHJlIDwtIHVuaXF1ZShtJHR5cG9fbWFpbGxlKSAlPiUgYXMuaW50ZWdlcigpDQojIGNvbE1hcCA8LSBjb2xzW29yZHJlXQ0KIyBwbG90KG1hcCxib3JkZXI9TkEpDQojIHBsb3Qoc3RfZ2VvbWV0cnkobnV0cyksY29sPSJsaWdodGdyZXkiLGJvcmRlcj0id2hpdGUiLGFkZD1UKQ0KIyB0eXBvTGF5ZXIoc3BkZiA9IG1hcCx2YXI9ImxpYl90eXBvX21haWxsZSIsYm9yZGVyPU5BLGNvbCA9IGNvbE1hcCxsZWdlbmQudGl0bGUudHh0ID0gIlR5cGUgZGUgbWFpbGxlIiwNCiMgICAgICAgICAgIGxlZ2VuZC5wb3MgPSAiYm90dG9tbGVmdCIsYWRkPVQpDQojIHBsb3Qoc3RfZ2VvbWV0cnkoc3RfY2VudHJvaWQobGFiZWxzKSksYWRkPVQscGNoPTE1KQ0KIyBsYWJlbExheWVyKHg9ZGVjYWxlLHR4dD0ibGliZ2VvIikNCmBgYA0KDQoqU291cmNlcyA6IGNhbGN1bHMgU0RFUyoNCg0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqKkVuY2FkcsOpIDogbGEgY29uc3RydWN0aW9uIGRlcyBtYWlsbGVzIGhhYml0YXQqKg0KDQpMZSBTREVTIGEgbGFuY8OpIGVuIDIwMTcgdW4gcHJvamV0IHZpc2FudCDDoCBjb25zdHJ1aXJlIHVuIG1haWxsYWdlIGR1IHRlcnJpdG9pcmUgw6AgbcOqbWUgZGUgcmVuZHJlIGNvbXB0ZSBkZXMgZGlzcGFyaXTDqXMgdGVycml0b3JpYWxlcyBzdXIgbGVzIGVuamV1eCBwcm9wcmVzIGF1IGxvZ2VtZW50LiBFbiBlZmZldCwgbmkgbGVzIMOpY2hlbGxlcyBhZG1pbmlzdHJhdGl2ZXMsIG5pIGxlcyB6b25hZ2VzIGTigJnDqXR1ZGVzIGRlIGzigJlJbnNlZSAoem9uZXMgZOKAmWVtcGxvaSwgYmFzc2lucyBkZSB2aWUpIG5lIHNvbnQgYWRhcHTDqWVzIHBvdXIgbOKAmWFuYWx5c2UgbG9jYWxpc8OpZSBkdSBsb2dlbWVudCwgY2FyIGlscyBtw6psZW50IGRhbnMgbGVzIG3Dqm1lcyBtYWlsbGVzIGRlcyB0eXBlcyBk4oCZaGFiaXRhdCBkaWZmw6lyZW50cyAodXJiYWluIGV0IHDDqXJpdXJiYWlucyBub3RhbW1lbnQpLiBMZSBncm91cGUgZGUgdHJhdmFpbCBjb25zdGl0dcOpIHBvdXIgY2UgcHJvamV0IGEgc8OpbGVjdGlvbm7DqSBsZXMgbmV1ZiBpbmRpY2F0ZXVycyBwcsOpc2VudMOpcyBjaS1hdmFudCBldCBjaG9pc2l0IHVuZSBtw6l0aG9kZSBkZSAqcsOpZ2lvbmFsaXNhdGlvbiogYWZpbiBkZSByZWdyb3VwZXIgbGVzIGNvbW11bmVzIGhvbW9nw6huZXMgc3VyIGNlcyBuZXVmIGRpbWVuc2lvbnMgZGFucyBkZXMgbWFpbGxlcyBoYWJpdGF0LiBMYSBtw6l0aG9kZSByZXRlbnVlIGVzdCBs4oCZYWxnb3JpdGhtZSAqU0tBVEVSKiAoU3BhdGlhbCBLbHVzdGVyaW5nIEFuYWx5c2lzIGJ5IFRyZWUgRWRnZSBSZW1vdmFsKS4gDQoNCkRpZmbDqXJlbnRlcyBzaW11bGF0aW9ucyBvbnQgw6l0w6kgbWVuw6llcyBwb3VyIGTDqXRlcm1pbmVyIGxhIHRhaWxsZSBkZSBjZXMgbWFpbGxlcywgZXQgbGVzIHLDqXN1bHRhdHMgb250IGZhaXQgbOKAmW9iamV0IGRlIHRlc3RzIGF1IG5pdmVhdSByw6lnaW9uYWwuIENlcyBtYWlsbGVzIG1ldHRlbnQgYXUgcHJlbWllciBwbGFuIGxlcyBkaXNwYXJpdMOpcyBwcm9wcmVzIGF1IGxvZ2VtZW50IChwb3V2b2lyIGTigJlhY2hhdCBpbW1vYmlsaWVyLCB0YWlsbGUgZGVzIG3DqW5hZ2VzKSwgYWxvcnMgcXVlIGxhIG1haWxsZSBjb21tdW5hbGUgZmFpdCBwcmluY2lwYWxlbWVudCByZXNzb3J0aXIgbGVzIGRpc3Bhcml0w6lzIGxpw6llcyBhdSBkZWdyw6kgZOKAmXVyYmFuaXTDqS4gRWxsZSBwZXJtZXQgw6lnYWxlbWVudCBkZSBkaXN0aW5ndWVyIGxlcyB2aWxsZXMtY2VudHJlIGRlIGxldXIgcMOpcmlwaMOpcmllLCBldCBkb25jIGTigJlpc29sZXIgbGVzIGVuamV1eCBwcm9wcmVzIMOgIGNlcyBlc3BhY2VzIHRyw6hzIGRpZmbDqXJlbnRzIHN1ciBsZSBwbGFuIGR1IGxvZ2VtZW50LiBMZSBndWlkZSBtw6l0aG9kb2xvZ2lxdWUgZMOpdGFpbGxhbnQgbGEgZMOpbWFyY2hlIGV0IGxlcyBtw6l0aG9kZXMgdXRpbGlzw6llcyBzZSB0cm91dmUgICoqc3VyIGNldHRlIHBhZ2Ugw6AgYWpvdXRlcioqDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCiMgQ29ow6lzaW9uIGV0IGR5bmFtaXF1ZSBkZSBjZXMgbWFyY2jDqXMNCg0KKkludHJvZHVjdGlvbiA6IEJpZW4gcXVlIGxhIG3DqXRob2RlIGNvbnNpc3RlIMOgIHJlZ3JvdXBlciBsZXMgY29tbXVuZXMgcHJvY2hlcyBkdSBwb2ludCBkZSB2dWUgZGVzIGluZGljYXRldXJzIGRlIG1hcmNow6kgcmV0ZW51cywgY2VzIG1hcmNow6lzIGFpbnNpIGNvbnN0aXR1w6lzIHNvbnQgcGx1cyBvdSBtb2lucyBob21vZ8OobmVzLCBlbiBwYXJ0aWN1bGllciAgdW5lIGRpdmVyc2l0w6kgaW1wb3J0YW50ZSBlc3Qgb2JzZXJ2w6llIGRhbnMgbGVzIGVzcGFjZXMgZGUgZmFpYmxlIGRlbnNpdMOpLiBUb3V0ZWZvaXMsIGxlcyB0cmFqZWN0b2lyZXMgZGUgY2VzIG1hcmNow6lzIGR1IGxvZ2VtZW50IHRlbmRlbnQgw6AgcmVuZm9yY2VyIGxldXJzIHNww6ljaWZpY2l0w6lzIHByb3ByZXMsIGNlIHF1aSBjb250cmlidWUgw6AgdmFsaWRlciBsZSBtYWlsbGFnZS4qDQoNCkxhIHR5cG9sb2dpZSBwcsOpY8OpZGVudGUgcGVybWV0IGRlIG1ldHRyZSBlbiDDqXZpZGVuY2UgbGVzIGdyYW5kZXMgZGlzcGFyaXTDqXMgcXVpIHRyYXZlcnNlbnQgbGVzIGRpZmbDqXJlbnRzIG1hcmNow6lzIGR1IGxvZ2VtZW50LiBNYWlzIGNlcyBtYXJjaMOpcyBwcsOpc2VudGVudCBkZSBs4oCZaMOpdMOpcm9nw6luw6lpdMOpIMOpZ2FsZW1lbnQgZW50cmUgbGVzIGNvbW11bmVzIHF1aSBsZXMgY29tcG9zZW50LiBMZSBzY29yZSBkZSBkaXZlcnNpdMOpICh2b2lyIGVuY2FkcsOpKSBtb250cmUgZGVzIHNww6ljaWZpY2l0w6lzIHRlcnJpdG9yaWFsZXMgbWFycXXDqWVzLiBFbiBwcmVtaWVyIGxpZXUsIGxlcyBjb21tdW5lcyBkYW5zIGzigJl1cmJhaW4gZXQgbGUgcMOpcml1cmJhaW4gc29udCBwbHVzIGhvbW9nw6huZXMgcXVlIGxlcyBlc3BhY2VzIGRlIGZhaWJsZSBkZW5zaXTDqSBkw6ltb2dyYXBoaXF1ZS4gUGFyIGFpbGxldXJzLCBsZXMgbWFpbGxlcyBkZSBsYSBjbGFzc2UgY29ycmVzcG9uZGFudCBhdXggZXNwYWNlcyDDoCB2b2NhdGlvbiB0b3VyaXN0aXF1ZSBwcsOpc2VudGVudCB1bmUgZm9ydGUgaMOpdMOpcm9nw6luw6lpdMOpIGludGVybmUgKGZpZ3VyZSA1KSBj4oCZZXN0IGxlIGNhcyBwYXIgZXhlbXBsZSBkZSBsYSBOb3JtYW5kaWUgZXQgZHUgcGxhdGVhdSBkZSBMYW5ncmVzLiBVbmUgcGFydGllIGRlIGxhIGNvdXJvbm5lIHDDqXJpdXJiYWluZSBkZSBQYXJpcywgw6AgbOKAmWV4Y2VwdGlvbiBkZSBs4oCZT3Vlc3QgcHLDqXNlbnRlIMOpZ2FsZW1lbnQgZGVzIG1hcmNow6lzIHRyw6hzIGRpc3BhcmF0ZXMuIEEgbOKAmW9wcG9zw6ksIGzigJlPdWVzdCBkdSBwYXlzIGFwcGFyYcOudCBwbHVzIGhvbW9nw6huZSwgbm90YW1tZW50IGxhIEJyZXRhZ25lIGV0IGxlcyBQYXlzIGRlIGxhIExvaXJlLiBMZSBkw6lwYXJ0ZW1lbnQgZHUgTm9yZCwgYWluc2kgcXVlIGzigJlBbHNhY2UgZXQgbGUgTHlvbm5haXMgcHLDqXNlbnRlbnQgw6lnYWxlbWVudCBkZSBtb2luZHJlcyBkaXNwYXJpdMOpcyBpbnRlcm5lcy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKipFbmNhZHLDqSA6IGxlIHNjb3JlIGRlIGRpdmVyc2l0w6kgKioNClBvdXIgbWVzdXJlciBsZXMgZGlzcGFyaXTDqXMgZW50cmUgbGVzIGNvbW11bmVzIGF1IHNlaW4gZOKAmXVuIG3Dqm1lIG1hcmNow6kgZHUgbG9nZW1lbnQgKG1haWxsZSksIG9uIGNhbGN1bGUgdW4gc2NvcmUgZGUgZGl2ZXJzaXTDqSA6IGlsIHPigJlhZ2l0IGRlIGxhIHNvbW1lIGRlcyDDqWNhcnRzLXR5cGVzLCBjYWxjdWzDqXMgc3VyIGNoYWN1biBkZXMgaW5kaWNhdGV1cnMgKHF1aSBvbnQgw6l0w6kgY2VudHLDqXMtcsOpZHVpdHMgYXUgcHLDqWFsYWJsZSkuIFBsdXMgY2Ugc2NvcmUgZXN0IMOpbGV2w6ksIHBsdXMgbOKAmWjDqXTDqXJvZ8OpbsOpaXTDqSBkZSBsYSBtYWlsbGUgY29uc2lkw6lyw6llIGVzdCBpbXBvcnRhbnRlLiBDZXJ0YWluZXMgbWFpbGxlcyBu4oCZw6l0YW50IGNvbnN0aXR1w6llcyBxdWUgZOKAmXVuZSBzZXVsZSBjb21tdW5lIChnw6luw6lyYWxlbWVudCBsZXMgdmlsbGVzLWNlbnRyZXMgZGVzIGFpcmVzIHVyYmFpbmVzKSwgY2Ugc2NvcmUgbuKAmWVzdCBwYXMgY2FsY3VsYWJsZS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCioqIEZpZ3VyZSA6IFNjb3JlIGQnaMOpdMOpcm9nw6luw6lpdMOpIHBhciBtYWlsbGUqKg0KYGBge3J9DQpsb2FkKCIuLi9iZGRfaW5kaWMuUkRhdGEiKQ0KbnVtIDwtIHNlbGVjdChiZGRfaW5kaWMsc3RhcnRzX3dpdGgoImluZGljLiIpKSAlPiUNCiAgbXV0YXRlKGluZGljLnRyYW5zYWMuMTI9aWZlbHNlKGlzLmluZmluaXRlKGluZGljLnRyYW5zYWMuMTIpLE5BLGluZGljLnRyYW5zYWMuMTIpKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVucygoLi1tZWFuKC4sbmEucm09VCkpL3NkKC4sbmEucm09VCkpKQ0KDQpjb2hlcyA8LSBkYXRhLmZyYW1lKGNvZGdlbz1iZGRfaW5kaWMkY29kZ2VvLG1haWxsZT16b25hZ2VzWyxjaG9peF0sbnVtKSAlPiUNCiAgbWVyZ2UoY2wsYnkueD0ibWFpbGxlIixieS55PWNob2l4KSAlPiUNCiAgZ3JvdXBfYnkobWFpbGxlKSAlPiUNCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsZnVuY3Rpb24oeCkgc2QoeCxuYS5ybSA9IFQpKQ0KY29oZXMkc2NvcmUgPC0gYXBwbHkoY29oZXNbLC0xXSxNQVJHSU4gPSAxLHN1bSkNCm1hcENvaGVzIDwtIG1lcmdlKG1hcCxjb2hlcyxieS54PWNob2l4LGJ5Lnk9Im1haWxsZSIsYWxsLng9VCkNCmNob3JvTGF5ZXIoc3BkZj1tYXBDb2hlcyx2YXIgPSAic2NvcmUiLGJvcmRlcj1OQSxuY2xhc3MgPSA4LGxlZ2VuZC52YWx1ZXMucm5kID0gMSwNCiAgICAgICAgICAgbGVnZW5kLnRpdGxlLnR4dCA9ICJTY29yZSBkZSBkaXZlcnNpdMOpIikNCmBgYA0KDQoqU291cmNlIDogY2FsY3VscyBTREVTKg0KDQoNCkzigJlhbmFseXNlIHN0YXRpcXVlIGRlcyBpbmRpY2F0ZXVycyBwZXJtZXQgZG9uYyBkZSBtZXR0cmUgZW4gw6l2aWRlbmNlIGRlcyBkaXNwYXJpdMOpcyBpbnRlciBldCBpbnRyYS1tYWlsbGVzLiBM4oCZYW5hbHlzZSBkZSBjZXMgaW5kaWNhdGV1cnMgKmVuIMOpdm9sdXRpb24qIG1vbnRyZSBsYSBkeW5hbWlxdWUgZGUgY2VzIGVzcGFjZXMuIE9yLCBsYSBjb3Jyw6lsYXRpb24gZW50cmUgbGVzIGluZGljYXRldXJzIHByaXMgZW4gc3RvY2sgKGPigJllc3Qgw6AgZGlyZSDDoCB1biBpbnN0YW50IFQpIGV0IGVuIMOpdm9sdXRpb24gZXN0IHN5c3TDqW1hdGlxdWVtZW50IHBvc2l0aXZlIDogbGEgZGlhZ29uYWxlIGRlIGxhIGZpZ3VyZSA2IGlsbHVzdHJlIGNlcyBjb3Jyw6lsYXRpb25zLiBDZWxhIHNpZ25pZmllIGRvbmMgcXVlIGxhIHRyYWplY3RvaXJlIGRlcyBtYXJjaMOpcyBkdSBsb2dlbWVudCBlc3Qgw6l0cm9pdGVtZW50IGxpw6llIMOgIGxldXIgc2l0dWF0aW9uLiBFbiBk4oCZYXV0cmVzIHRlcm1lcywgbGVzIGNhcmFjdMOpcmlzdGlxdWVzIGRlIGNlcyBtYXJjaMOpcyBvbnQgdGVuZGFuY2Ugw6Agc2UgcmVuZm9yY2VyIGRhbnMgbGUgdGVtcHMuIFBhciBleGVtcGxlLCBpbCBleGlzdGUgdW5lIGZvcnRlIGNvcnLDqWxhdGlvbiBlbnRyZSBsZSBuaXZlYXUgZHUgcG91dm9pciBk4oCZYWNoYXQgaW1tb2JpbGllciAocHJpeCByYXBwb3J0w6lzIGF1eCByZXZlbnVzKSBldCBzb24gw6l2b2x1dGlvbiBhdSBjb3VycyBkdSB0ZW1wcywgY2UgcXVpIHNpZ25pZmllIHF1ZSBsZXMgcHJpeCBvbnQgbGUgcGx1cyBwcm9ncmVzc8OpIGRhbnMgbGVzIG1haWxsZXMgb8O5IGlscyBzb250IGxlcyBwbHVzIMOpbGV2w6lzLiBMZSBjb25zdGF0IGVzdCBzaW1pbGFpcmUgcG91ciBsYSBkdXLDqWUgZOKAmW9jY3VwYXRpb24gZGVzIGxvZ2VtZW50cyBxdWkgYSBwcm9ncmVzc8OpIGzDoCBvw7kgZWxsZSDDqXRhaXQgZMOpasOgIMOpbGV2w6llLiBTdXIgbGVzIGF1dHJlcyBpbmRpY2F0ZXVycywgbGEgY29ycsOpbGF0aW9uIGVzdCBwbHVzIGZhaWJsZSwgbWFpcyB0b3Vqb3VycyBwb3NpdGl2ZS4NCg0KDQoqKkZpZ3VyZSA6IENvcnLDqWxhdGlvbiBlbnRyZSBsZXMgaW5kaWNhdGV1cnMgZGUgc3RvY2sgZXQgZCfDqXZvbHV0aW9uDQoNCmBgYHtyfQ0KYSA8LSBzZWxlY3QobUBkYXRhLGluZGljLm1lbmFnLjE0LGluZGljLnJzLjE0LGluZGljLnZhYy4xNCxpbmRpYy5wcml4X3Jldi4xMixpbmRpYy5qZXVuLjE1LA0KICAgICAgICAgICAgICAgICBpbmRpYy50cmFuc2FjLjEyLA0KICAgICAgICAgICAgICAgICBpbmRpYy5zb2MuMTUsaW5kaWMuc3Vyb2MuMTUsaW5kaWMuZHVyb2MuMTUpDQojIE9uIHJlbm9tbWUgbGVzIHZhcmlhYmxlcyBwb3VyIGZhaXJlIHVuIGpvbGkgZ3JhcGhpcXVlDQpuYW1lcyhhKVsxOjldIDwtIGMoIk5iIHBlcnMgcGFyIG3DqW5hZ2VzIiwiUGFydCByw6lzaWQuIHNlY29uZGFpcmVzIiwiUGFydCBsb2cgdmFjYW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUHJpeCBsb2cgcmFwcG9ydMOpcyBhdXggcmV2ZW51cyIsIkluZGljZSBqZXVuZXNzZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiVGF1eCB0cmFuc2FjdGlvbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnQgbG9nIHNvY2lhdXgiLCJTdXJvY2N1cGF0aW9uIiwiRHVyw6llIG9jY3VwYXRpb24iKQ0KDQpiIDwtIHNlbGVjdChtQGRhdGEsZXZvLm1lbmFnLGV2by5ycyxldm8udmFjLGV2by5wcml4X3Jldixldm8uamV1biwNCiAgICAgICAgICAgICAgICAgZXZvLnRyYW5zYWMsDQogICAgICAgICAgICAgICAgIGV2by5zb2MsZXZvLnN1cm9jLGV2by5kdXJvYykNCm5hbWVzKGIpWzE6OV0gPC0gYygiTmIgcGVycyBtw6luYWdlIiwiUGFydCByw6lzaWQuIHNlY29uZGFpcmVzIiwiUGFydCBsb2cgdmFjYW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUHJpeCByYXBwLiByZXZlbnVzIiwiSW5kaWNlIGpldW5lc3NlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJUYXV4IHRyYW5zYWN0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUGFydCBsb2cgc29jaWF1eCIsIlN1cm9jY3VwYXRpb24iLCJEdXIuIG9jY3VwYXRpb24iKQ0KDQpjYyAgPC0gIGNvcihhLGIsdXNlID0gImNvbXBsZXRlLm9icyIpIA0KY2MgIDwtIGRhdGEuZnJhbWUoU3RvY2tzPXJvd25hbWVzKGNjKSxjYykgJT4lDQogIGdhdGhlcihrZXk9IkV2b2x1dGlvbnMiLHZhbHVlPSJDb3JyZWxhdGlvbiIsLVN0b2NrcykNCmdncGxvdChjYyxhZXMoU3RvY2tzLEV2b2x1dGlvbnMsZmlsbD1Db3JyZWxhdGlvbikpICsgZ2VvbV90aWxlKCkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSJyZWQiLGhpZ2g9ImJsdWUiKSArIHhsYWIoIlN0b2NrcyIpICsgDQogIHlsYWIoIkV2b2x1dGlvbnMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkNCmBgYA0KDQoqU291cmNlcyA6IGNhbGN1bHMgU0RFUyoNCg0KQ2VzIGR5bmFtaXF1ZXMgc2UgcmV0cm91dmVudCBkYW5zIGxlcyDDqXZvbHV0aW9ucyBkZSBwb3B1bGF0aW9uLiBFbiBlZmZldCwgZCd1bmUgbWFuacOocmUgZ8OpbsOpcmFsZSwgbGEgcG9wdWxhdGlvbiBjcm/DrnQgcGx1cyByYXBpZGVtZW50IGRhbnMgbGVzIG1hcmNow6lzIHRlbmR1cyAocGx1cyBwcsOpY2lzw6ltZW50IGRhbnMgbGVzIGNsYXNzZXMgNCDDoCA2KSA7IGxhIGR5bmFtaXF1ZSBkZSBsYSBkZW1hbmRlLCBldCBsYSByZWxhdGl2ZSByaWdpZGl0w6kgZGUgbCdvZmZyZSB0ZW5kIGRvbmMgw6AgcmVuZm9yY2VyIGxlcyBkw6lzw6lxdWlsaWJyZXMgb2JzZXJ2w6lzIHN1ciBsZXMgbWFyY2jDqXMgbG9jYXV4IGR1IGxvZ2VtZW50LiBMZXMgbWFpbGxlcyBlbiBjb3Vyb25uZXMgZGVzIGFpcmVzIHVyYmFpbmVzIGF0dHJhY3RpdmVzIHNvbnQgY2VsbGVzIGRvbnQgbGEgcG9wdWxhdGlvbiBhIGxlIHBsdXMgcmFwaWRlbWVudCBhdWdtZW50w6ksIMOgIHJhaXNvbiBkZSAxLDUgJSBjaGFxdWUgYW5uw6llIGVudHJlIDE5OTkgZXQgMjAxNC4gVmllbm5lbnQgZW5zdWl0ZSBsZXMgbWFpbGxlcyBkZXMgZXNwYWNlcyB0b3VyaXN0aXF1ZXMgZG9udCBsYSBjcm9pc3NhbmNlIGTDqW1vZ3JhcGhpcXVlIGVzdCBkZSAwLDkgJSBlbiBtb3llbm5lIGFubnVlbGxlIHN1ciBsYSBtw6ptZSBww6lyaW9kZS4NCg0KUGFyIGFpbGxldXJzLCBsZXMgbWFpbGxlcyBwZXUgdGVuZHVlcyBkZXMgY291cm9ubmVzIHDDqXJpdXJiYWluZXMgY29ubmFpc3NlbnQgw6lnYWxlbWVudCB1bmUgY3JvaXNzYW5jZSBzaWduaWZpY2F0aXZlLCBtYWlzIGxhIHLDqXNlcnZjZSBmb25jacOocmUgZGUgY2VzIGVzcGFjZXMgY29udHJpYnVlIHZyYWlzZW1ibGFibGVtZW50IMOgIGFtb2luZHJpciBsZSByZW5mb3JjZW1lbnQgZHUgZGVncsOpIGRlIHRlbnNpb24uDQoNCioqRmlndXJlIDogVGF1eCBkZSBjcm9pc3NhbmNlIGFubnVlbCBtb3llbiAoMTk5OS0yMDE0KSBkZSBsYSBwb3B1bGF0aW9uKioNCmBgYHtyfQ0KcG9wIDwtIHJlYWQuY3N2MigiRGF0YS9SUF9IaXN0LmNzdiIpICU+JSANCiAgbWVyZ2Uoem9uYWdlc1ssYygiY29kZ2VvIixjaG9peCldLGJ5Lng9IkNPREdFTyIsYnkueT0iY29kZ2VvIixhbGwueT1UKSAlPiUNCiAgbWVyZ2UoY2wsYnkueD1jaG9peCxieS55PWNob2l4KSAlPiUNCiAgZ3JvdXBfYnkobGliX3R5cG9fbWFpbGxlKSAlPiUNCiAgc3VtbWFyaXNlKHBvcDE0ID0gc3VtKFAxNF9QT1ApLHBvcDk5PXN1bShEOTlfUE9QKSkgJT4lDQogIG11dGF0ZShldm9sX3BvcD0xMDAqKChwb3AxNC9wb3A5OSleKDEvMTUpLTEpLENsYXNzZT1saWJfdHlwb19tYWlsbGUpDQpnZ3Bsb3QoZGF0YT1wb3AsYWVzKHg9Q2xhc3NlLHdlaWdodD1ldm9sX3BvcCxmaWxsPUNsYXNzZSkpICsgZ2VvbV9iYXIoKSArDQogIHlsYWIoIkV2b2x1dGlvbiBkZSBsYSBwb3B1bGF0aW9uIikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29scykgKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkNCg0KYGBgDQoNCg0KKlNvdXJjZSA6IEluc2VlLCBSUCwgY2FsY3VscyBTREVTKg==